package chemtools_logica.BDL.SFBean;

import chemtools_logica.BDL.IL.BDL_SFTransformacionesLocal;
import chemtools_logica.BDL.IR.BDL_SFTransformacionesRemote;

import chemtools_logica.Beans.EventoxinsumoBean;
import chemtools_logica.Beans.FormulaBean;
import chemtools_logica.Beans.InsumoBean;

import chemtools_logica.Beans.OrdenproduccionBean;

import chemtools_logica.Beans.OrdenproduccionxTipoproduccionBean;

import chemtools_logica.Entidades.Detalleformula;
import chemtools_logica.Entidades.Eventoxinsumo;
import chemtools_logica.Entidades.EventoxinsumoPK;
import chemtools_logica.Entidades.Formula;
import chemtools_logica.Entidades.Insumo;
import chemtools_logica.Entidades.Ordenproduccion;
import chemtools_logica.Entidades.Tipoproductoxordenproduccion;
import chemtools_logica.Entidades.Transformacion;

import chemtools_logica.Entidades.Vista.Graficoinsumoenprod;

import chemtools_logica.Entidades.Vista.Graficoinsumoenprodpormes;

import chemtools_logica.Entidades.Vista.Graficoordenescumppormes;

import chemtools_logica.Entidades.Vista.Graficoordenessegunlab;

import chemtools_logica.Entidades.Vista.Graficoprodenprodpormes;

import chemtools_logica.Entidades.Vista.Graficoproductosenprod;

import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import weblogic.servlet.cluster.wan.Update;

@Stateless(name = "BDL_SFTransformaciones", mappedName = "CHEMTOOLS_APP-Chemtools_Logica-BDL_SFTransformaciones")
public class BDL_SFTransformacionesBean implements BDL_SFTransformacionesRemote, BDL_SFTransformacionesLocal {
    @Resource
    SessionContext sessionContext;
    @PersistenceContext(unitName = "Chemtools_Logica")
    private EntityManager em;
    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
    
    public BDL_SFTransformacionesBean() {
    }

    public Transformacion persistTransformacion(Transformacion transformacion) {
        em.persist(transformacion);
        return transformacion;
    }

    public Transformacion mergeTransformacion(Transformacion transformacion) {
        return em.merge(transformacion);
    }

    /** <code>select o from Transformacion o</code> */
    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
    public List<Transformacion> getTransformacionFindAll() {
        return em.createNamedQuery("Transformacion.findAll", Transformacion.class).getResultList();
    }
    
    public List<Ordenproduccion> busquedaOrdenes(OrdenproduccionBean bean){
        List<Ordenproduccion> listaOrdenprod = new ArrayList<Ordenproduccion>();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        String ejbQuery1 =  " SELECT ordp.* "+
                            " FROM ordenproduccion AS ordp " +
                            " INNER JOIN usuario AS usu ON usu.idUsuario = ordp.idUsuario " +
                            " INNER JOIN laboratorio AS lab ON lab.idLaboratorio = ordp.idLaboratorio ";
                            if(bean.getLaboratorio().getNombre() != null){
                                ejbQuery1 += "AND lab.nombre like '%"+bean.getLaboratorio().getNombre()+"%' ";
                            }
                            if(bean.getFechaRegistroDesde() != null || bean.getFechaRegistroHasta() != null){           
                                if(bean.getFechaRegistroDesde() != null){
                                    ejbQuery1 += "AND ordp.FechaRegistro >= '"+sdf.format(bean.getFechaRegistro())+"' ";
                                }            
                                if(bean.getFechaRegistroHasta() != null){
                                    ejbQuery1 += "AND ordp.FechaRegistro <= '"+sdf.format(bean.getFechaRegistro())+"' ";
                                }
                            }
                            if(bean.getEstado() == 0){
                                ejbQuery1 += "AND (ordp.estado = 1 OR ordp.estado = 2) ";
                            }
                            if(bean.getEstado() != 0){
                                ejbQuery1 += "AND ordp.estado = "+bean.getEstado();
                            }
        try{
            System.out.println(ejbQuery1);
            Query query = em.createNativeQuery(ejbQuery1, Ordenproduccion.class);            
            listaOrdenprod = query.getResultList();
        }catch(Exception e)
        {
            listaOrdenprod = null;
        }
        return listaOrdenprod;
    }
    
    public List<Tipoproductoxordenproduccion> busquedaProductosOrdenes(OrdenproduccionBean bean){
        List<Tipoproductoxordenproduccion> listaOrdenprod = new ArrayList<Tipoproductoxordenproduccion>();
        
        String ejbQuery1 =" SELECT ordtp.* "+
                            "FROM tipoproductoxordenproduccion AS ordtp ";
                            if(bean.getIdOrdenProduccion() != 0){
                                ejbQuery1 += " Where ordtp.idOrdenProduccion = '"+bean.getIdOrdenProduccion()+"' ";
                            }
        try{
            Query query = em.createNativeQuery(ejbQuery1, Tipoproductoxordenproduccion.class);            
            listaOrdenprod = query.getResultList();
        }catch(Exception e)
        {
            listaOrdenprod = null;
        }
        return listaOrdenprod;
    }
    
    public List<Formula> busquedaFormulasCompatibles(int id){
        List<Formula> listaForm = new ArrayList<Formula>();
        
        String ejbQuery1 =  " SELECT form.* "+
                            " FROM formula AS form "+
                            " INNER JOIN detalleformula AS dtf "+
                            " ON dtf.idFormula = form.idFormula "+
                            " AND dtf.idTipoProducto = "+id+
                            " GROUP by idFormula ";
        try{
            Query query = em.createNativeQuery(ejbQuery1, Formula.class);            
            listaForm = query.getResultList();
        }catch(Exception e)
        {
            listaForm = null;
        }
        return listaForm;
    }
    
    public List<Transformacion> buscaTransformacion(String nombre, Date fechaMin, Date fechaMax){
        List<Transformacion> listaTran = new ArrayList<Transformacion>();
        
        String ejbQuery1 =  " SELECT tr.* "+
                            " FROM Transformacion AS tr "+
                            " INNER JOIN producto AS prod  "+
                            " ON tr.idProducto = prod.idProducto "+
                            " INNER JOIN tipoproducto AS tprod  "+
                            " ON prod.idTipoProducto = tprod.idTipoProducto "+
                            " AND tprod.Descripcion = '"+nombre+"' ";
                            if(fechaMin != null){
                                ejbQuery1+= " AND tr.Fecha_Tansformacion >= "+sdf.format(fechaMin);
                            }
                            if(fechaMax != null){
                                ejbQuery1+= " AND tr.Fecha_Tansformacion <= "+sdf.format(fechaMax);
                            }
                            ejbQuery1+=" GROUP by idProducto ";
        try{
            Query query = em.createNativeQuery(ejbQuery1, Transformacion.class);            
            listaTran = query.getResultList();
        }catch(Exception e)
        {
            listaTran = null;
        }
        return listaTran;
    }
    
    public List<Eventoxinsumo> buscaInsumosProd(String idProducto){
        List<Eventoxinsumo> listaTran = new ArrayList<Eventoxinsumo>();
        
        String ejbQuery1 =  " SELECT evins.* "+
                            " FROM eventoxinsumo AS evins "+
                            " Where evins.idProducto = '"+idProducto+"' "+
                            " GROUP by idInsumo ";
        try{
            Query query = em.createNativeQuery(ejbQuery1, Eventoxinsumo.class);            
            listaTran = query.getResultList();
        }catch(Exception e)
        {
            listaTran = null;
        }
        return listaTran;
    }
    
    public List<Detalleformula> busquedaItemTipoFromDetalle(int idFormula, int idProducto){
        List<Detalleformula> listaForm = new ArrayList<Detalleformula>();
        
        String ejbQuery1 =  " SELECT def.* "+
                            " FROM detalleformula AS def "+
                            " WHERE 1 = 1 "+
                            " AND def.idTipoProducto = "+idProducto+
                            " AND def.idFormula = "+idFormula;
        try{
            Query query = em.createNativeQuery(ejbQuery1, Detalleformula.class);            
            listaForm = query.getResultList();
        }catch(Exception e)
        {
            listaForm = null;
        }
        return listaForm;
    }
    
    public List<Detalleformula> busquedaDetalle(int idFormula){
        List<Detalleformula> listaForm = new ArrayList<Detalleformula>();
        
        String ejbQuery1 =  " SELECT dtf.* "+
                            " FROM detalleformula AS dtf "+
                            " WHERE 1 = 1 "+
                            " AND dtf.idFormula = "+idFormula;
        System.out.println(ejbQuery1);
        try{
            Query query = em.createNativeQuery(ejbQuery1, Detalleformula.class);            
            listaForm = query.getResultList();
        }catch(Exception e)
        {
            listaForm = null;
        }
        return listaForm;
    }
    
    public void updateCantidadInsumo(InsumoBean ins){
        List<Detalleformula> listaForm = new ArrayList<Detalleformula>();
        String ejbQuery1 =  " Update insumo "+
                            " set contenido = "+ins.getContenido()+", estado = "+ins.getEstado()+
                            " WHERE insumo.idInsumo = '"+ins.getIdInsumo()+"'";
        System.out.println(ejbQuery1);
        
        try{
            Query query = em.createNativeQuery(ejbQuery1);
            query.executeUpdate();
        }catch(Exception e)
        {
            listaForm = null;
        }
    }
    
    public Insumo getInsumoParaTransformar(String idInsumo){
        Insumo insumo = new Insumo();
        
        String ejbQuery1 =  " SELECT ins.* "+
                            " FROM insumo AS ins "+
                            " WHERE 1 = 1 "+
                            " AND ins.idInsumo = '"+idInsumo+"'";
        System.out.println(ejbQuery1);
        try{
            Query query = em.createNativeQuery(ejbQuery1, Insumo.class);            
            List<Insumo> listaIns = query.getResultList();
            insumo = listaIns.get(0);
        }catch(Exception e)
        {
            insumo = null;
        }
        return insumo;
    }
    
    public void makeEvento(EventoxinsumoBean evt){
        Insumo insumo = new Insumo();
        String ejbQuery1 =  " Insert into eventoxinsumo "+
                            " values ("+0+","+evt.getIdEvento()+",'"+evt.getInsumo().getIdInsumo()+"'"+
                            ","+evt.getIdUsuario()+","+evt.getInsumo().getIdAlmacen()+               
                            ",'"+sdf.format(evt.getFecha_Evento())+"',"+evt.getContenido()+",'"+evt.getIdProducto()+"')";  
        System.out.println(ejbQuery1);
        try{
            Query query = em.createNativeQuery(ejbQuery1); 
            query.executeUpdate();
            
        }catch(Exception e)
        {
            insumo = null;
        }
    }
    
    
    public List<Graficoinsumoenprod> callProcedureGraficoInsumoEnProd(Date fechaMin, Date fechaMax){
        String ejbQuery = "{CALL graficoInsumoEnProd(?,?)}";
        Query query = em.createNativeQuery(ejbQuery, Graficoinsumoenprod.class);
        query.setParameter(1,"1980-10-10");
        query.setParameter(2,"3000-10-10");
        if(fechaMin != null){
        query.setParameter(1, sdf.format(fechaMin));
        }
        if(fechaMax != null){
        query.setParameter(2, sdf.format(fechaMax));
        }
        List<Graficoinsumoenprod> grafico = query.getResultList();
        return grafico;         
    }
    
    public List<Graficoinsumoenprodpormes> callProcedureGraficoInsumoEnProdPorMes(Date fechaMin, Date fechaMax){
        String ejbQuery = "{CALL graficoInsumoEnProdPorMes(?,?)}";
        Query query = em.createNativeQuery(ejbQuery, Graficoinsumoenprodpormes.class);
        query.setParameter(1,"1980-10-10");
        query.setParameter(2,"3000-10-10");
        if(fechaMin != null){
        query.setParameter(1, sdf.format(fechaMin));
        }
        if(fechaMax != null){
        query.setParameter(2, sdf.format(fechaMax));
        }
        List<Graficoinsumoenprodpormes> grafico = query.getResultList();
        return grafico;         
    }
    
    public List<Graficoordenescumppormes> callProcedureGraficoOrdenesCumpPorMes(Date fechaMin, Date fechaMax){
        String ejbQuery = "{CALL graficoOrdenesCumpPorMes(?,?)}";
        Query query = em.createNativeQuery(ejbQuery, Graficoordenescumppormes.class);
        query.setParameter(1,"1980-10-10");
        query.setParameter(2,"3000-10-10");
        if(fechaMin != null){
        query.setParameter(1, sdf.format(fechaMin));
        }
        if(fechaMax != null){
        query.setParameter(2, sdf.format(fechaMax));
        }
        List<Graficoordenescumppormes> grafico = query.getResultList();
        return grafico;         
    }
    
    public List<Graficoordenessegunlab> callProcedureGraficoOrdenesSegunLab(Date fechaMin, Date fechaMax){
        String ejbQuery = "{CALL graficoOrdenesSegunLab(?,?)}";
        Query query = em.createNativeQuery(ejbQuery, Graficoordenessegunlab.class);
        query.setParameter(1,"1980-10-10");
        query.setParameter(2,"3000-10-10");
        if(fechaMin != null){
        query.setParameter(1, sdf.format(fechaMin));
        }
        if(fechaMax != null){
        query.setParameter(2, sdf.format(fechaMax));
        }
        List<Graficoordenessegunlab> grafico = query.getResultList();
        return grafico;         
    }
    
    public List<Graficoprodenprodpormes> callProcedureGraficoProdEnProdPorMes(Date fechaMin, Date fechaMax){
        String ejbQuery = "{CALL graficoProdEnProdPorMes(?,?)}";
        Query query = em.createNativeQuery(ejbQuery, Graficoprodenprodpormes.class);
        query.setParameter(1,"1980-10-10");
        query.setParameter(2,"3000-10-10");
        if(fechaMin != null){
        query.setParameter(1, sdf.format(fechaMin));
        }
        if(fechaMax != null){
        query.setParameter(2, sdf.format(fechaMax));
        }
        List<Graficoprodenprodpormes> grafico = query.getResultList();
        return grafico;         
    }
    
    public List<Graficoproductosenprod> callProcedureGraficoProductosEnProd(Date fechaMin, Date fechaMax){
        String ejbQuery = "{CALL graficoProductosEnProd(?,?)}";
        Query query = em.createNativeQuery(ejbQuery, Graficoproductosenprod.class);
        query.setParameter(1,"1980-10-10");
        query.setParameter(2,"3000-10-10");
        if(fechaMin != null){
        query.setParameter(1, sdf.format(fechaMin));
        }
        if(fechaMax != null){
        query.setParameter(2, sdf.format(fechaMax));
        }
        List<Graficoproductosenprod> grafico = query.getResultList();
        return grafico;         
    }
    
}
